package br.com.foxinline.manager.criar;

import br.com.foxinline.enums.*;
import br.com.foxinline.manager.generico.ManagerPesquisarGenerico;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;
import org.primefaces.context.RequestContext;

/**
 *
 * @author ely
 */
@ViewScoped
@ManagedBean
public class ManagerMemorialDescritivo extends ManagerPesquisarGenerico<Imovel> {

    @EJB
    ImovelServico imovelServico;
    @EJB
    PrefeituraServico prefeituraServico;
    private Proprietario proprietario;
    private Endereco endereco;
    private List<Imovel> imoveis;
    private Imovel imovel;
    private List<Imovel> imoveisMemorialDescritivo;
    /**
     * Pesquisa Avançada
     */
    private boolean registroAlteracao;
    private boolean inclusao;
    private boolean alteracao;
    private Boolean imovelComNumero;
    private Boolean imovelComCroqui;
    private Boolean imovelComAnexo;
    private Boolean imovelComProprietario;
    private Boolean imovelComDimensoes;
    private Boolean imovelComConfrontacao;
    private List<Bairro> bairrosSelecionados;
    private String inscricaoCadastralQuadra = "";

    @PostConstruct
    public void init() {
        this.imoveis = new ArrayList<Imovel>();
        this.proprietario = new Proprietario();
        this.endereco = new Endereco();
        this.imovel = new Imovel();

        this.proprietario.setTipoDocumento(TipoDocumento.CPF);
    }

    public void pesquisarImovel() {

        List<Integer> quadras = formatarInscricaoCadastralQuadras();

        if (quadras == null) {
            return;
        }

        imovelServico.setImovelComNumero(this.imovelComNumero);
        imovelServico.setImovelComAnexo(this.imovelComAnexo);
        imovelServico.setImovelComCroqui(this.imovelComCroqui);
        imovelServico.setImovelComProprietario(this.imovelComProprietario);
        imovelServico.setImovelComDimensao(this.imovelComDimensoes);
        imovelServico.setImovelComConfrontacao(this.imovelComConfrontacao);
        imovelServico.setImovelQuadras(quadras);
        setServico(imovelServico);

        this.proprietario.setCpf(Caracter.removecaracter(this.proprietario.getCpf()));
        this.proprietario.setCnpj(Caracter.removecaracter(this.proprietario.getCnpj()));
        this.endereco.setCep(Caracter.removecaracter(this.endereco.getCep()));

        this.imovel.setProprietarios(new ArrayList<Proprietario>());
        this.imovel.getProprietarios().add(this.proprietario);
        this.imovel.setEnderecoImovel(this.endereco);

        this.imovel.setSituacaoImovel(SituacaoImovel.APTO);

        this.imoveis = imovelServico.find(this.imovel, null, null);
    }

    public void relatorioMemorialDescritivo(Imovel imovel) {

//        if (imovel.getSituacaoImovel() != null && !imovel.getSituacaoImovel().equals(SituacaoImovel.APTO)) {
//            Msg.messagemWarn("Este imóvel não está Apto para Regularização Fundiária!");
//            return;
//        }

        this.imoveisMemorialDescritivo = new ArrayList<Imovel>();

        this.imoveisMemorialDescritivo.add(imovel);

        if (this.imoveisMemorialDescritivo != null && !this.imoveisMemorialDescritivo.isEmpty()) {
            RequestContext.getCurrentInstance().execute("imprimirMemorialDescritivo.jq.click();");
        } else {
            Msg.messagemWarn("Nenhum registro encontrado !");
        }
    }

    public void relatorioMemorialDescritivo() {
        this.proprietario.setCpf(Caracter.removecaracter(this.proprietario.getCpf()));
        this.proprietario.setCnpj(Caracter.removecaracter(this.proprietario.getCnpj()));
        this.endereco.setCep(Caracter.removecaracter(this.endereco.getCep()));

        this.imovel.setEnderecoImovel(this.endereco);
        this.imovel.setProprietarios(new ArrayList<Proprietario>());
        this.imovel.getProprietarios().add(this.proprietario);

        this.imoveisMemorialDescritivo = imovelServico.find(this.imovel, null, null);

        if (this.imoveisMemorialDescritivo != null && !this.imoveisMemorialDescritivo.isEmpty()) {
            RequestContext.getCurrentInstance().execute("imprimirMemorialDescritivo.jq.click();");
        } else {
            Msg.messagemWarn("Nenhum registro encontrado !");
        }
    }

    public void relatorioTodosMemorialDescritivo() {
        if (this.imoveis != null && !this.imoveis.isEmpty()) {
            RequestContext.getCurrentInstance().execute("imprimirTodosMemorialDescritivo.jq.click();");
        } else {
            Msg.messagemWarn("Nenhum registro encontrado !");
        }
    }

    public void imprimirMemorialDescritivo() {
        HashMap parametros = new HashMap();

        parametros.putAll(prefeituraServico.parametroPrefeitura());

        imovelServico.relatorioMemorialDescritivo(parametros, this.imoveisMemorialDescritivo);
    }

    public void imprimirTodosMemorialDescritivo() {
        HashMap parametros = new HashMap();

        parametros.putAll(prefeituraServico.parametroPrefeitura());

        imovelServico.relatorioMemorialDescritivo(parametros, this.imoveis);
    }

    public List<SelectItem> tipoDocumento() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoDocumento tipo : TipoDocumento.values()) {
            items.add(new SelectItem(tipo.getTipo(), tipo.getNome()));
        }
        return items;
    }

    public void atualizarTipoRegistro(boolean tipoInclusao) {

        if (tipoInclusao && this.inclusao) {
            this.alteracao = false;
        } else if (!tipoInclusao && this.alteracao) {
            this.inclusao = false;
        }

        if (this.inclusao) {
            this.imovel.setComando(Comando.INCLUSAO);
        } else if (this.alteracao) {
            this.imovel.setComando(Comando.ALTERACAO);
        } else {
            this.imovel.setComando(null);
        }
    }

    public Proprietario getProprietario() {
        return proprietario;
    }

    public void setProprietario(Proprietario proprietario) {
        this.proprietario = proprietario;
    }

    public Endereco getEndereco() {
        return endereco;
    }

    public void setEndereco(Endereco endereco) {
        this.endereco = endereco;
    }

    public List<Imovel> getImoveis() {
        return imoveis;
    }

    public void setImoveis(List<Imovel> imoveis) {
        this.imoveis = imoveis;
    }

    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public List<Imovel> getImoveisMemorialDescritivo() {
        return imoveisMemorialDescritivo;
    }

    public void setImoveisMemorialDescritivo(List<Imovel> imoveisMemorialDescritivo) {
        this.imoveisMemorialDescritivo = imoveisMemorialDescritivo;
    }

    public Boolean getImovelComNumero() {
        return imovelComNumero;
    }

    public void setImovelComNumero(Boolean imovelComNumero) {
        this.imovelComNumero = imovelComNumero;
    }

    public Boolean getImovelComCroqui() {
        return imovelComCroqui;
    }

    public void setImovelComCroqui(Boolean imovelComCroqui) {
        this.imovelComCroqui = imovelComCroqui;
    }

    public Boolean getImovelComAnexo() {
        return imovelComAnexo;
    }

    public void setImovelComAnexo(Boolean imovelComAnexo) {
        this.imovelComAnexo = imovelComAnexo;
    }

    public Boolean getImovelComProprietario() {
        return imovelComProprietario;
    }

    public void setImovelComProprietario(Boolean imovelComProprietario) {
        this.imovelComProprietario = imovelComProprietario;
    }

    public Boolean getImovelComDimensoes() {
        return imovelComDimensoes;
    }

    public void setImovelComDimensoes(Boolean imovelComDimensoes) {
        this.imovelComDimensoes = imovelComDimensoes;
    }

    public Boolean getImovelComConfrontacao() {
        return imovelComConfrontacao;
    }

    public void setImovelComConfrontacao(Boolean imovelComConfrontacao) {
        this.imovelComConfrontacao = imovelComConfrontacao;
    }

    public List<Bairro> getBairrosSelecionados() {
        return bairrosSelecionados;
    }

    public void setBairrosSelecionados(List<Bairro> bairrosSelecionados) {
        this.bairrosSelecionados = bairrosSelecionados;
    }

    public String getInscricaoCadastralQuadra() {
        return inscricaoCadastralQuadra;
    }

    public void setInscricaoCadastralQuadra(String inscricaoCadastralQuadra) {
        this.inscricaoCadastralQuadra = inscricaoCadastralQuadra;
    }

    public boolean isRegistroAlteracao() {
        return registroAlteracao;
    }

    public void setRegistroAlteracao(boolean registroAlteracao) {
        this.registroAlteracao = registroAlteracao;
    }

    public boolean isInclusao() {
        return inclusao;
    }

    public void setInclusao(boolean inclusao) {
        this.inclusao = inclusao;
    }

    public boolean isAlteracao() {
        return alteracao;
    }

    public void setAlteracao(boolean alteracao) {
        this.alteracao = alteracao;
    }

    @Override
    public void limpar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void remover() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    public List<Integer> formatarInscricaoCadastralQuadras() {

        if (this.inscricaoCadastralQuadra == null) {
            return new ArrayList<Integer>();
        }

        String[] inscricaoCadastralQuadras = this.inscricaoCadastralQuadra.trim().split(";");
        String[] sequenciaQuadra;
        List<Integer> quadras = new ArrayList<Integer>();

        if (inscricaoCadastralQuadras.length == 1 && !inscricaoCadastralQuadras[0].contains(",") && !inscricaoCadastralQuadras[0].contains("-")
                && inscricaoCadastralQuadras[0] != null && !inscricaoCadastralQuadras[0].isEmpty()) {
            quadras.add(Integer.parseInt(inscricaoCadastralQuadras[0]));
            return quadras;
        }

        for (String sequencia : inscricaoCadastralQuadras) {

            if (sequencia.trim().contains(",")) {

                sequenciaQuadra = sequencia.trim().split(",");

                if (sequenciaQuadra.length == 1) {
                    Msg.messagemError("Você digitou uma sequência inválida no campo Quadra !");
                    return null;
                }

                for (String string : sequenciaQuadra) {
                    quadras.add(Integer.parseInt(string));
                }

            } else if (sequencia.trim().contains("-")) {
                sequenciaQuadra = sequencia.trim().split("-");

                if (sequenciaQuadra.length == 1 || sequenciaQuadra.length > 2) {
                    Msg.messagemError("Você digitou uma sequência inválida no campo Quadra !");
                    return null;
                }

                if (Integer.parseInt(sequenciaQuadra[0]) > Integer.parseInt(sequenciaQuadra[1])) {
                    for (int i = Integer.parseInt(sequenciaQuadra[1]); i <= Integer.parseInt(sequenciaQuadra[0]); i++) {
                        quadras.add(new Integer(i));
                    }
                } else {
                    for (int i = Integer.parseInt(sequenciaQuadra[0]); i <= Integer.parseInt(sequenciaQuadra[1]); i++) {
                        quadras.add(new Integer(i));
                    }
                }
            } else if (sequencia != null && !sequencia.isEmpty()) {
                quadras.add(new Integer(sequencia));
            }
        }

        return quadras;
    }
}
